package publicacion;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import model.Publicacion.Pregunta;
import model.Publicacion.Respuesta;
import model.Usuario.UsuarioSimple;
import model.sistema.Sistema;
import model.votoYfav.Favorito;
import model.votoYfav.Voto;

import org.joda.time.DateTime;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;



public class TestPublicacion {
	
	Pregunta preguntaA;
	Respuesta respuestaA;
	UsuarioSimple usuarioN;
	UsuarioSimple usuarioM;
	Sistema sistema;
	
	Favorito favoritoA;
	Favorito favoritoB;
	Favorito favoritoC;
	
	Voto votoA;
	Voto votoB;
	
	@Before
	public void setUp()
	{

		Sistema sistema=new Sistema();
		usuarioN       = new UsuarioSimple(sistema,"nombreN", "emailN", "nombreUsuarioN");

		sistema = new Sistema();
		usuarioN       = new UsuarioSimple(sistema, "nombreN", "emailN", "nombreUsuarioN");

		preguntaA      = new Pregunta("estoEsElTitulo",usuarioN,"estoEsUnCuerpo");

		usuarioM       = new UsuarioSimple(sistema,"nombreM", "emailM", "nombreUsuarioM");

		usuarioM       = new UsuarioSimple(sistema, "nombreM", "emailM", "nombreUsuarioM");

		respuestaA     = new Respuesta("estoEsElCuerpo", usuarioM, preguntaA);
		
		favoritoA	   =mock(Favorito.class);
		favoritoB	   =mock(Favorito.class);
		favoritoC      =mock(Favorito.class);
		
		votoA	= mock(Voto.class);
		votoB 	= mock(Voto.class);
	}
	
	@Test
	public void testearPublicacionAgregarFavoritos()
	{

		int cantidadEsperada = 0;

		
		

		Assert.assertEquals(cantidadEsperada, preguntaA.getCantFavoritos());
		
		cantidadEsperada++;
		preguntaA.SumarFavorito(favoritoA);
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantFavoritos());
		
		cantidadEsperada++;
		preguntaA.SumarFavorito(favoritoB);
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantFavoritos());
		
		cantidadEsperada++;
		preguntaA.SumarFavorito(favoritoC);
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantFavoritos());
		
		
		
	}
	
	@Test
	public void testearPublicacionAgregarVotosPositivos(){
		
		
		int expected = 0;
		
		when(votoA.aFavor()).thenReturn(true);
		when(votoB.aFavor()).thenReturn(true);
		
		Assert.assertEquals(expected,preguntaA.getCantVotosPositivos());
		
		expected++;
		preguntaA.sumarVoto(votoA);
		Assert.assertEquals(expected,preguntaA.getCantVotosPositivos());
		
		expected++;
		preguntaA.sumarVoto(votoA);
		Assert.assertEquals(expected,preguntaA.getCantVotosPositivos());
		
		
		
	}
	
	@Test
	public void testearPublicacionAgregarVotosNegativos(){
		
		int  expected = 0;
		
		when(votoA.aFavor()).thenReturn(false);
		when(votoB.aFavor()).thenReturn(false);
		
		Assert.assertEquals(expected,preguntaA.getCantVotosNegativos());
		
		expected++;
		preguntaA.sumarVoto(votoA);
		Assert.assertEquals(expected,preguntaA.getCantVotosNegativos());
		
		expected++;
		preguntaA.sumarVoto(votoA);
		Assert.assertEquals(expected,preguntaA.getCantVotosNegativos());
		
		
		
		
	}
	
	@Test
	public void testSacarVotoDe(){
		
		
		Voto a = new Voto(preguntaA, usuarioM, true);
		Voto b = new Voto(preguntaA, usuarioN,true);

		
		preguntaA.sumarVoto(a);
		Assert.assertEquals(1,preguntaA.getCantVotosPositivos());
		
		preguntaA.sumarVoto(b);
		Assert.assertEquals(2,preguntaA.getCantVotosPositivos());
		
		preguntaA.sacarVotoDe(usuarioM);
		Assert.assertEquals(1, preguntaA.getCantVotosPositivos());
		
		
		
		
	}
	
	@Test
	public void testSacarFavoritoDe(){
		int cantidadEsperada = 1;

		Favorito favoritoNoDeseado;
		Favorito favoritoEsperado;
		favoritoNoDeseado = new Favorito(usuarioM, preguntaA);
		favoritoEsperado = new Favorito(usuarioN, preguntaA);
		
		preguntaA.SumarFavorito(favoritoNoDeseado);
		preguntaA.SumarFavorito(favoritoEsperado);
		
		preguntaA.sacarFavoritoDe(usuarioM);
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantFavoritos());
		Assert.assertEquals(favoritoEsperado, preguntaA.getFavoritos().get(0));
	}
	@Test
	public void testSetCuerpo()
	{
		preguntaA.setCuerpo("asd");
		Assert.assertEquals("asd", preguntaA.getCuerpo());
	}
	@Test
	public void testGetFecha()
	{
		
		Assert.assertEquals(DateTime.now(), preguntaA.getFecha());
	}
	@Test
	public void testEliminacion()
	{
		Assert.assertEquals(false,preguntaA.estaEliminada());
		preguntaA.eliminar();
		Assert.assertEquals(true,preguntaA.estaEliminada());
	}
	@Test
	public void testGetCantVotos()
	{
		Assert.assertEquals(0, preguntaA.getCantVotos());
		preguntaA.sumarVoto(votoA);
		preguntaA.sumarVoto(votoB);
		Assert.assertEquals(2, preguntaA.getCantVotos());
		
	}
	
	
}
